package com.specter.sure.core;

import java.util.Map;

public interface StokenizorProvider {

	/**
	 * 缓存对象，过期时间默认设置
	 * 
	 * @param key   键
	 * @param value 值
	 */
	public void set(Object key, Object value);

	/**
	 * 缓存对象，指定过期时间
	 * 
	 * @param key    键
	 * @param value  值
	 * @param expire 过期时长(秒)
	 */
	public void set(Object key, Object value, long expire);

	/**
	 * 通过key获取缓存对象
	 * 
	 * @param key  键
	 * @param type 值类型
	 * @return 值对象
	 */
	public <T> T get(Object key, Class<T> type);

	/**
	 * 通过key获取缓存对象，并将对象在原基础上增加expire时间过期
	 * 
	 * @param key    键
	 * @param type   值类型
	 * @param expire 过期时长(秒)
	 * @return 值对象
	 */
	public <T> T get(Object key, Class<T> type, long expire);

	/**
	 * 校验key对应的值是否存在或者是否过期
	 * 
	 * @param key 键
	 * @return 成功与否
	 */
	public boolean valid(Object key);

	/**
	 * 校验key对应的值是否存在或者是否过期，缓存对象与传入值是否相等
	 * 
	 * @param key   键
	 * @param value 值
	 * @return 成功与否
	 */
	public boolean valid(Object key, Object value);

	/**
	 * 清空对应的缓存对象
	 * 
	 * @param key 键
	 */
	public void evict(Object key);

	/**
	 * 为token生成一次性ticket，用一次即无效，统一设置ticket时效
	 * 
	 * @param token 有效性令牌
	 * @return ticket 一次性票据
	 */
	public String ticketCreate(String token);

	/**
	 * 通过ticket获取具体token，用一次即无效
	 * 
	 * @param ticket 一次性票据
	 * @return token 有效性令牌
	 */
	public String ticketValidate(String ticket);

	/**
	 * 生成携带信息的token
	 * 
	 * @param claims 信息内容
	 * @param expire 过期时长(秒)
	 * @return token
	 */
	public String tokenCreate(Map<String, String> claims, long expire);

	/**
	 * 校验信息是否准确无误
	 * 
	 * @param token
	 * @return claims 信息明文
	 */
	public Map<String, String> tokenValidate(String token);

	/**
	 * 通过用户token创建内部sessionid
	 * 
	 * @param token 待存储令牌
	 * 
	 * @return sessionid内部用户标识
	 */
	public String stokenCreate(String token);

	/**
	 * 通过sessionid和缓存key获取值对象
	 * 
	 * @param sid sessionid内部ID
	 * @param key 键代号
	 * 
	 * @return sessionid用户的缓存key
	 */
	public String stokenToKey(String sid, String key);
}
